package ebj.common.base;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

/**
 * http://book.51cto.com/art/201303/382814.htm
 * <p>
 * 功能说明:...
 * </p>
 * 
 * @author zhoushineyoung@hotmail.com
 * @time 2016年4月26日 下午7:38:27
 */
public class Ch1_7 extends Applet {
	int width, height;
	Image image; // 缓冲区对象

	Graphics g1;

	public void init() // Applet初始化时调用
	{
		setBackground(Color.black); // 设置背景
		this.setSize(350, 310);

		width = getSize().width; // 获得窗口宽度
		height = getSize().height;
		image = createImage(width, height); // 创建图像对象
		g1 = image.getGraphics();
	}

	public void paint(Graphics g) // 绘图方法
	{
		g1.clearRect(0, 0, width, height);
		g1.setColor(Color.red);

		double x, y, r; // 横纵坐标及半径
		Image image = this.createImage(WIDTH, HEIGHT);
		Graphics pic = image.getGraphics();
		/**
		 * 由前面的问题分析可知，心形函数为r=a(1-sinθ)，要做直角坐标系转换，
		 * 然后投影到xOy平面上，坐标确定下来后调用画椭圆方法来画心形图案上的点。
		 * 程序代码如下：
		 */
		// 在缓冲区绘制心形图案
		for (int i = 0; i <= 90; i++)
			// 控制横向变化
			for (int j = 0; j <= 90; j++) // 控制竖向变化
			{
				// 转换为直角坐标
				r = Math.PI / 45 * i * (1 - Math.sin(Math.PI / 45 * j)) * 18;
				x = r * Math.cos(Math.PI / 45 * j) * Math.sin(Math.PI / 45 * i)
						+ width / 2; // 为了在中间显示，加了偏移量
				y = -r * Math.sin(Math.PI / 45 * j) + height / 4;
				// 为了在中间显示，加了偏移量
				g1.fillOval((int) x, (int) y, 2, 2); // 绘制点}
				// 显示缓存区的可变Image对象
				g.drawImage(image, 0, 0, this);
			}
	}
}